/*
 * Copyright (c) 2024 endless-sky
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#ifndef _HAL_VENC_H_
#define _HAL_VENC_H_

#ifdef __cplusplus
extern "C" {
#endif

#include "hal_struct.h"

/**
 * @function:   Hal_Venc_Config
 * @brief:      开启视频编码
 * @param[in]:  HAL_U8 u8SenIdx          视频输入通道号
 * @param[in]:  HAL_U32 encChan         编码通道号
 * @param[in]:  HAL_VENC_CONFIG_S *pCfg  编码参数
 *
 * @return	返回DSP_SUCCESS-成功，其它值		失败，请参考错误码
 */
int32_t Hal_Venc_Config(uint8_t u8SenIdx, uint32_t encChan, HAL_VENC_CONFIG_S *pCfg);

/**
 * @function:   Hal_Venc_Start
 * @brief:      开启视频编码
 * @param[in]:  HAL_U8 u8SenIdx          视频输入通道号
 * @param[in]:  HAL_U32 encChan         编码通道号
 * @param[in]:  HAL_VENC_CONFIG_S *pCfg  编码参数
 *
 * @return	返回DSP_SUCCESS-成功，其它值		失败，请参考错误码
 */
int32_t Hal_Venc_Start(uint8_t u8SenIdx, uint32_t encChan, HAL_VENC_CONFIG_S *pCfg);

/**
 * @function:   Hal_Venc_Stop
 * @brief:      关闭视频编码
 * @param[in]:  HAL_U8 u8SenIdx   视频输入通道号
 * @param[in]:  HAL_U32 encChan  编码通道号
 *
 * @return  返回DSP_SUCCESS-成功，其它值        失败，请参考错误码
 */
int32_t Hal_Venc_Stop(uint8_t u8SenIdx, uint32_t encChan);

/**
 * @function:   Hal_Venc_StopJpeg
 * @brief:      关闭JPEG编码(T31等部分SOC架构需区分处理)
 * @param[in]:  HAL_U8 u8SenIdx   视频输入通道号
 * @param[in]:  HAL_U32 encChan  编码通道号
 *
 * @return  返回DSP_SUCCESS-成功，其它值        失败，请参考错误码
 */
int32_t Hal_Venc_StopJpeg(uint8_t u8SenIdx, uint32_t encChan);

/**
 * @function:   Hal_Venc_GetStream
 * @brief:      获取视频编码码流，调用一次获取一帧
 * @param[in]:  HAL_U8 u8SenIdx               视频输入通道号
 * @param[in]:  HAL_U32 encChan              编码通道号
 * @param[out]: HAL_VENC_STREAM_S *pStream  码流帧信息
 *
 * @return  返回DSP_SUCCESS-成功，其它值        失败，请参考错误码
 */
int32_t Hal_Venc_GetStream(uint8_t u8SenIdx, uint32_t encChan, HAL_VENC_STREAM_S *pStream);

/**
 * @function:   Hal_Venc_ReleaseStream
 * @brief:      获取视频编码码流，调用释放之前获取的帧
 * @param[in]:  HAL_U8 u8SenIdx  视频输入通道号
 * @param[in]:  HAL_U32 encChan 编码通道号
 * @param[out]: release_handler 释放帧的句柄，从GetStream得到
 *
 * @return  返回DSP_SUCCESS-成功，其它值        失败，请参考错误码
 */
int32_t Hal_Venc_ReleaseStream(uint8_t u8SenIdx, uint32_t encChan, uint8_t *pRelHandler);

/**
 * @function:   Hal_VENC_Force_Iframe
 * @brief:      强制I帧
 * @param[in]:  HAL_U8 u8SenIdx               视频输入通道号
 * @param[in]:  HAL_U32 encChan              编码通道号
 * @param[out]:
 *
 * @return  返回DSP_SUCCESS-成功，其它值        失败，请参考错误码
 */
int32_t Hal_Venc_ForceIframe(uint8_t u8SenIdx, uint32_t encChan);

#ifdef __cplusplus
}
#endif

#endif // _HAL_VENC_H_
